package com.appspot.bs24event.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

import com.appspot.bs24event.common.Constants;
import com.appspot.bs24event.common.Constants.NAVI;
import com.appspot.bs24event.util.GoogleAccountUtil;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

/**
 * InitFilter.
 *
 * @version $Id: InitFilter.java 178 2011-08-11 07:50:50Z bs24event@gmail.com $
 *
 */
public class InitFilter implements Filter {

    /** ログ */
    protected static final Logger logger = Logger.getLogger(InitFilter.class.getName());

    @Override
    public void init(FilterConfig config) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,  FilterChain chain)
    throws IOException, ServletException
    {
        HttpServletRequest  request  = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // リクエストのあったURL
        String requestUri = request.getRequestURI();
        if (logger.isDebugEnabled()) logger.debug("requestUri = "+requestUri);

        // ナビ設定
        if ( requestUri != null ) {
            if ( requestUri.startsWith("/event") ) {
                request.setAttribute(Constants.NAVI, NAVI.EVENT);
            } else if ( requestUri.startsWith("/photo") ) {
                request.setAttribute(Constants.NAVI, NAVI.PHOTO);
            } else if ( requestUri.startsWith("/blog") ) {
                request.setAttribute(Constants.NAVI, NAVI.BLOG);
            } else if ( requestUri.startsWith("/common/maintenance") ) {
                request.setAttribute(Constants.NAVI, "");
            } else if ( requestUri.startsWith("/admin/event") ) {
                request.setAttribute(Constants.NAVI, NAVI.EDIT_EVENT);
            } else if ( requestUri.startsWith("/admin/finance") ) {
                request.setAttribute(Constants.NAVI, NAVI.FINANCE);
            } else {
                request.setAttribute(Constants.NAVI, NAVI.HOME);
            }
        }

        // googleアカウントにログインしているかを判定
        if ( GoogleAccountUtil.isGoogleLogin(request) ) {
            UserService userService = UserServiceFactory.getUserService();
            request.setAttribute(Constants.LOGIN, true);
            request.setAttribute(Constants.LOGOUT_URL, userService.createLogoutURL("/"));   //ログアウトURL

            if ( GoogleAccountUtil.isGoogleAdmin(request) ) {
                // 管理者でログインしている
                request.setAttribute(Constants.ADMIN, true);
            } else if ( GoogleAccountUtil.isArrowGoogleAccount(request) ) {
                // 許可されたアカウントでログインしている
                request.setAttribute(Constants.MEMBER, true);
            } else {
                // 許可されていないアカウントでログインしている
                request.setAttribute(Constants.OTHER, true);
                if ( requestUri.startsWith("/member") ) {
                    request.setAttribute("ERROR", "そのコンテンツへのアクセスが許可されていません。<br />許可されているGoogleアカウントでログインし直してください。");
                    request.getRequestDispatcher("/common/error").forward(request, response);
                    return;
                }
            }
        }
        chain.doFilter(request, response);
    }
}
